package org.ibase4j.core.base;

import java.io.File;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.ibase4j.core.util.BarcodeUtil;
import org.ibase4j.model.SceneType;
import org.ibase4j.model.sys.BarcodeScene;
import org.ibase4j.service.sys.BarcodeSceneService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import top.ibase4j.core.base.BaseMapper;
import top.ibase4j.core.base.BaseModel;
import top.ibase4j.core.base.BaseServiceImpl;
import top.ibase4j.core.support.ftp.SftpClient;
import top.ibase4j.core.util.InstanceUtil;
import top.ibase4j.core.util.PropertiesUtil;

/**
 * <p>
 * 应用基础服务类
 * </p>
 * @author zoyee
 * @since 2018-08-06
 */
public class AppBaseServiceImpl<T extends BaseModel, M extends BaseMapper<T>> extends BaseServiceImpl<T, M> {
	@Autowired
	protected BarcodeSceneService barcodeSceneService;
	
	private String DEFAULT_BARCODE_PATH = PropertiesUtil.getString("temporary.file.path");
	private String PRE_BARCODE_PATH = PropertiesUtil.getString("sftp.nginx.path");
	private String barcodeSubDir = "";
	private int qrWidth = 300;
	private int qrHeight = 300;
	private int barWidth = 300;
	private int barHeight = 100;
	
	/**
	 * 生成场景ID
	 * @param key
	 * @return
	 */
	private String createSceneId(SceneType sceneType,String key) {
		return sceneType.getPrefix() + key;
	}
	
	private String getBacodePath() {
		return DEFAULT_BARCODE_PATH + this.barcodeSubDir;
	}
	
	public String createLineBarcode(String sceneId, String dir, int width, int height) {
		return BarcodeUtil.createBarcode(dir, sceneId, width, height);
	}
	
	public String createWxQrcode(String sceneId, String dir, int width, int height) {
//		return BarcodeUtil.createQrcode(dir, sceneId, width, height);
		return "";
	}
	
	public String createQrcode(String sceneId, String dir, int width, int height) {
		return BarcodeUtil.createQrcode(dir, sceneId, width, height);
	}
	
	/**
	 * 生成条码二维码
	 * @param sceneType 场景类型
	 * @param key 键
	 * @param content 场景附带内容
	 * @param operUserId 操作人
	 * @param operationClass 场景处理方法类
	 * @param returnData 返回值
	 * @param redirectUrl 跳转页面
	 * @param redirectPage 跳转小程序页面
	 * @param scanLimit 限制扫码次数
	 * @param scanUserRole 限制扫码角色
	 * @param validDateTime 有效期
	 * @return
	 */
	@Transactional
	public BarcodeScene createBarcode(SceneType sceneType, String key, String content, Long operUserId, Class operationClass,
			String returnData, String redirectUrl, String redirectPage, Long scanLimit, Long scanUserRole, Date validDateTime) {
		
		String sceneId = createSceneId(sceneType, key); // 根据场景类型和关键字封装场景ID
		
		String lineBarcode = createLineBarcode(sceneId, getBacodePath(), this.barWidth, this.barHeight); // 生成条形码
		
		SftpClient client = SftpClient.connect(); // 创建SFTP客户端
		
		String dir = PropertiesUtil.getString("sftp.baseDir") + PropertiesUtil.getString("sftp.qrcode.upload.path"); // 从配置文件中读取ftp服务器存储二维码的相对路径【注意：sftp配置文件在facade模块中】
		File file = new File(lineBarcode); // 根据本地条形码绝对路径创建File对象
		String fileName = file.getName(); // 获取本地条形码的文件名
		client.put(lineBarcode, dir + "/" +  fileName); // 将本地条形码文件上传到远程的ftp服务器指定的路径下面
//		UploadUtil.remove2Sftp(lineBarcode, "");
		
		
		String wxQrcode = createWxQrcode(sceneId, getBacodePath(), this.qrWidth, this.qrHeight);
		
		String qrcode = createQrcode(sceneId, getBacodePath(), this.qrWidth, this.qrHeight);
		
		String qrcodeDir = PropertiesUtil.getString("sftp.baseDir") + PropertiesUtil.getString("sftp.qrcode.upload.path"); // 从配置文件中读取ftp服务器存放二维码的相对路径【注意：本案例使用的是和条形码相同的路径】
		File qrcodeFile = new File(qrcode); // 根据本地二维码绝对路径创建File对象
		String qrcodeFileName = qrcodeFile.getName(); // 获取本地二维码的文件名
		client.put(qrcode, qrcodeDir + "/" + qrcodeFileName); // 将本地二维码上传到远程ftp服务器
		
		client.disconnect();
		
		BarcodeScene scene = new BarcodeScene();
		scene.setSceneId(sceneId);
		scene.setSceneType(sceneType.getCode());
		scene.setData(content);
		scene.setReturnData(returnData);
		scene.setScanCount(0L);
		if(operationClass != null) {
			scene.setOperation(operationClass.getName());
		}
		scene.setRemark(sceneType.getName());
		
//		scene.setLineBarcode(lineBarcode);
		File testFile = new File(lineBarcode); // 根据本地路径创建File对象【路径为：本地条形码绝对路径】
		scene.setLineBarcode(dir + "/" + testFile.getName()); // 获取条形码文件名
		testFile.delete(); // 删除本地的条形码文件
	
		
//		scene.setQrcode(qrcode);
		testFile = new File(qrcode); // 对File重新赋值【路径为：本地二维码绝对路径】
		scene.setQrcode(dir + "/" + testFile.getName()); // 获取二维码文件名
		testFile.delete(); // 删除本地的二维码文件
		
		scene.setWxQrcode(wxQrcode);
		scene.setRedirectPage(redirectPage);
		scene.setRedirectUrl(redirectUrl);
		scene.setScanLimit(scanLimit);
		scene.setScanUserRole(scanUserRole);
		scene.setValidDateTime(validDateTime);
		scene.setCreateBy(operUserId);
		scene.setCreateTime(new Date());
		barcodeSceneService.update(scene);
		
		// 创建条形码时修改响应数据【ftp远程服务器ip拼接上条形码的相对路径】
		scene.setLineBarcode(PRE_BARCODE_PATH + scene.getLineBarcode());
		scene.setQrcode(PRE_BARCODE_PATH + scene.getQrcode());
		return scene;
	}
	
	/**
	 * 查询条码二维码场景
	 * @param sceneType
	 * @param key
	 * @return
	 */
	public BarcodeScene fetchBarcode(SceneType sceneType, String key) {
		System.out.println("Hello Boy");
		Map<String, Object> params = InstanceUtil.newHashMap();
		params.put("enable", 1);
		params.put("sceneId", createSceneId(sceneType, key));
		List<BarcodeScene> list = barcodeSceneService.queryList(params);
		if(list != null && list.size() > 0) {
			String lineBarcode =  PRE_BARCODE_PATH + list.get(0).getLineBarcode();
			String qrcode = PRE_BARCODE_PATH + list.get(0).getQrcode();
			list.get(0).setLineBarcode(lineBarcode);
			list.get(0).setQrcode(qrcode);
			return list.get(0);
		}else {
			return createBarcode(sceneType, key, "", null, null, key, null, null, null, null, null);
		}
	}
}
